﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using TCC_Hotel.Entidades;
using System.Data.SqlClient;
using System.Configuration;

namespace TCC_Hotel.Repositorio
{
    public class ApartamentoRepositorio
    {
        ControleBancoDados controle = new ControleBancoDados();

        /// <summary>
        /// Cria o comando SQL e envia para um método inserir um novo apartamento nos bancos de dados
        /// </summary>
        /// <param name="apartamento">Entidade apartamento</param>
        /// <returns>true se inseriu ou false se não</returns>
        public bool CadastrarApartamento(Apartamento apartamento)
        {
            //definição do comando sql
            string sql =
                "INSERT INTO Apartamentos VALUES (" +
                apartamento.Numero + ", '" +
                apartamento.Nome + "', " +
                apartamento.QntMaximaHospedes + ", '" +
                true  + "')";

            //Método que escreve o comando sql nos bancos de dados
            return controle.EscreveBancoDados(sql);

        }

        /// <summary>
        /// Recupera um apartamento especifico do banco de dados
        /// </summary>
        /// <param name="CPF">numero da empresa que deseja recuperar</param>
        /// <returns>Entidade do apartamento recuperado</returns>
        public Apartamento RecuperarDetalhesApartamento(int numero)
        {
            Apartamento resposta = null;
            SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoServidor"].ConnectionString);
            SqlDataReader reader;
            //definição do comando sql
            string sql =
                "SELECT * FROM Apartamentos WHERE Numero = " + numero + "";

            //Cria uma objeto do tipo comando passando como parametro a string sql e a string de conexão
            SqlCommand comando = new SqlCommand(sql, con);

            //--------tenta conectar no servidor externo-----------------------
            try
            {

                //abre a conexao
                con.Open();

                //Verifica se tem algum comando nao executado no servidor principal
                controle.verificaConsistencia();
                controle.verificaConsistenciaLocal();

                //executa a query
                reader = comando.ExecuteReader();

                //le os dados retornados e monta objeto empresa
                resposta = ListarApartamentos(reader).FirstOrDefault();

                //fecha a conexao
                con.Close();
            }
            //--------Ocorreu excessao, conectar no servidor local-------------------------
            catch (SqlException e)
            {
                //erro referente a servidor inacessivel ou timeout ocorreu
                if (e.Number == 53 || e.Number == -2)
                {
                    //configura para apontar no servidor local
                    SqlConnection con2 = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoLocal"].ConnectionString);
                    comando.Connection = con2;

                    //abre conexao
                    con2.Open();

                    //executa a query
                    reader = comando.ExecuteReader();


                    //le os dados retornados e monta objeto empresa
                    resposta = ListarApartamentos(reader).FirstOrDefault();


                    //fecha a conexao
                    con2.Close();
                }

            }
            finally
            {
                con.Close();
            }

            return resposta;


        }


        /// <summary>
        /// pega todos os Apartamentos do banco
        /// </summary>
        /// <returns>Lista de Apartamentos</returns>
        public List<Apartamento> RecuperarApartamentos()
        {
            List<Apartamento> listaResposta = new List<Apartamento>();

            //pega o connectionstring do web config e configura apontando para o servidor externo
            SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoServidor"].ConnectionString);
            SqlDataReader reader = null;

            //monta a query
            string query = "SELECT * FROM Apartamentos";
            SqlCommand cmd = new SqlCommand(query, con);

            //--------tenta conectar no servidor externo-----------------------
            try
            {

                //abre conexao
                con.Open();

                //Verifica se tem algum comando nao executado no servidor principal
                controle.verificaConsistencia();
                controle.verificaConsistenciaLocal();

                //executa a query
                reader = cmd.ExecuteReader();

                //le os dados retornados
                listaResposta = ListarApartamentos(reader);

                //fecha conexao
                con.Close();
            }
            //--------Ocorreu excessao, conectar no servidor local-------------------------
            catch (SqlException e)
            {
                //erro referente a servidor inacessivel ou timeout ocorreu
                if (e.Number == 53 || e.Number == -2)
                {
                    //configura para apontar no servidor local
                    SqlConnection con2 = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoLocal"].ConnectionString);
                    cmd.Connection = con2;

                    //abre conexao
                    con2.Open();

                    //executa a query
                    reader = cmd.ExecuteReader();

                    //le os dados retornados
                    listaResposta = ListarApartamentos(reader);

                    //fecha conexao
                    con2.Close();
                }
            }
            finally
            {
                con.Close();
            }



            return listaResposta;
        }

        /// <summary>
        /// Cria o comando SQL e envia para um método editar um apartamento nos bancos de dados
        /// </summary>
        /// <param name="apartamento">Entidade apartamento</param>
        /// <param name="numero">numero do apartameento que sera editado</param>
        /// <returns>true se editou ou false se não</returns>
        public bool EditarApartamento(int numero, Apartamento apartamento)
        {
            //definição do comando sql
            string sql =
                "UPDATE Apartamentos SET " +
                "Numero = " + apartamento.Numero + ", " +
                "Nome = '" + apartamento.Nome + "', " +
                "QntHospedes = " + apartamento.QntMaximaHospedes +  " WHERE Numero = " + numero + "";
                 

            //Método que escreve o comando sql nos bancos de dados
            return controle.EscreveBancoDados(sql);

        }

        /// <summary>
        /// Cria o comando SQL e envia para um método mudar o status de um apartamento nos bancos de dados
        /// </summary>
        /// <param name="apartamento">novo status</param>
        /// <param name="numero">numero do apartameento que sera editado</param>
        /// <returns>true se editou ou false se não</returns>
        public bool EditarDisponibilidadeApartamento(int numero, bool status)
        {
            //definição do comando sql
            string sql =
                "UPDATE Apartamentos SET " +
                "Disponibilidade = '" + status + "' WHERE Numero = " + numero + "";


            //Método que escreve o comando sql nos bancos de dados
            return controle.EscreveBancoDados(sql);

        }


        /// <summary>
        /// Cria o comando SQL e envia para um método excluir um apartamento dos bancos de dados
        /// </summary>
        /// <param name="apartamento">numero do apartamento</param>
        /// <returns>true se excluiu ou false se não</returns>
        public bool ExcluirApartamento(int numero)
        {
            //definição do comando sql
            string sql =
                "DELETE FROM Apartamentos WHERE NUMERO = " + numero + "";

            //Método que escreve o comando sql nos bancos de dados
            return controle.EscreveBancoDados(sql);

        }


        /// <summary>
        /// Lê dados da tabela correspondente através de um comando SQL os montando a lista que é retornada
        /// </summary>
        /// <param name="reader"></param>
        /// <returns></returns>
        public List<Apartamento> ListarApartamentos(SqlDataReader reader)
        {
            List<Apartamento> listaResposta = new List<Apartamento>();

            //le os dados retornados
            while (reader.Read())
            {
                listaResposta.Add(new Apartamento()
                {
                    Numero = Convert.ToInt32(reader["Numero"]),
                    Nome = Convert.ToString(reader["Nome"]),
                    QntMaximaHospedes = Convert.ToInt32(reader["QntHospedes"]),
                    Disponibilidade = Convert.ToBoolean(reader["Disponibilidade"])
                    
                });

            }

            return listaResposta;
        }

        
    }
}